package ar.edu.caece.pl.alex.model.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ar.edu.caece.pl.alex.model.IDictionary;
import ar.edu.caece.pl.alex.model.IToken;

/**
 * Esta clase trata las palabras reservadas y devuelve tokens temporales 
 */
public class Dictionary implements IDictionary {
	
	private static List<String> palabrasReservadas = new ArrayList<String>();
	private static Map<Integer, String> tokenDesc = new HashMap<Integer, String>();
	
	private static IDictionary instance = new Dictionary();
	
	private Dictionary(){}	//Constructor privado = Singleton
	
	public static IDictionary getInstance() {
		return instance;
	}
	
	/* TOKENS AUXILIARES */	
	static {
	
		/* Tokens temporales para todas las palabras reservadas */
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_IF);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_THEN);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_ELSE);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_END_IF);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_WHILE);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_DO);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_END_WHILE);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_SHOW);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_SHOWLN);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_READ);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_INTEGER);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_NATURAL);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_TOINTEGER);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_TONATURAL);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_BYVAL);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_BYREF);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_PROCEDURE);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_BEGIN);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_FUNCTION);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_END_PROC);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_END_FUNC);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_ODD);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_EVEN);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_VAR);
		palabrasReservadas.add(IToken.PALABRA_RESERVADA_CONST);
		
		/* Descripciones de Token para cada tipo  */
		tokenDesc.put(IToken.TYPE_IDENTIFICADOR,"TOKEN_IDENTIFICADOR");
		tokenDesc.put(IToken.TYPE_PALABRA_RESERVADA,"TOKEN_PALABRA_RESERVADA");
		tokenDesc.put(IToken.TYPE_NUM_ENTERO,"TOKEN_NUM_ENTERO");
		tokenDesc.put(IToken.TYPE_NUM_NATURAL,"TOKEN_NUM_NATURAL");
		tokenDesc.put(IToken.TYPE_CADENA,"TOKEN_CADENA");
		tokenDesc.put(IToken.TYPE_COMENTARIO,"TOKEN_COMENTARIO");
		tokenDesc.put(IToken.TYPE_DOS_PUNTOS,"TOKEN_DOS_PUNTOS");
		tokenDesc.put(IToken.TYPE_ASIGNACION,"TOKEN_ASIGNACION");
		tokenDesc.put(IToken.TYPE_OPER_IGUAL,"TOKEN_OPER_IGUAL");
		tokenDesc.put(IToken.TYPE_OPER_MAS_INT,"TOKEN_OPER_MAS_INT");
		tokenDesc.put(IToken.TYPE_OPER_MAS_NAT,"TOKEN_OPER_MAS_NAT");
		tokenDesc.put(IToken.TYPE_OPER_MENOS_INT,"TOKEN_OPER_MENOS_INT");
		tokenDesc.put(IToken.TYPE_OPER_MENOS_NAT,"TOKEN_OPER_MENOS_NAT");
		tokenDesc.put(IToken.TYPE_OPER_MULT_INT,"TOKEN_OPER_MULT_INT");
		tokenDesc.put(IToken.TYPE_OPER_MULT_NAT,"TOKEN_OPER_MULT_NAT");
		tokenDesc.put(IToken.TYPE_OPER_DIV_INT,"TOKEN_OPER_DIV_INT");
		tokenDesc.put(IToken.TYPE_OPER_DIV_NAT,"TOKEN_OPER_DIV_NAT");
		tokenDesc.put(IToken.TYPE_OPER_MENOR,"TOKEN_OPER_MENOR");
		tokenDesc.put(IToken.TYPE_OPER_MAYOR,"TOKEN_OPER_MAYOR");
		tokenDesc.put(IToken.TYPE_OPER_MENOR_IGUAL,"TOKEN_OPER_MENOR_IGUAL");
		tokenDesc.put(IToken.TYPE_OPER_MAYOR_IGUAL,"TOKEN_OPER_MAYOR_IGUAL");
		tokenDesc.put(IToken.TYPE_OPER_DISTINTO,"TOKEN_OPER_DISTINTO");
		tokenDesc.put(IToken.TYPE_PARENTESIS_IZQ,"TOKEN_PARENTESIS_IZQ");
		tokenDesc.put(IToken.TYPE_PARENTESIS_DER,"TOKEN_PARENTESIS_DER");
		tokenDesc.put(IToken.TYPE_CORCHETE_IZQ,"TOKEN_CORCHETE_IZQ");
		tokenDesc.put(IToken.TYPE_CORCHETE_DER,"TOKEN_CORCHETE_DER");
		tokenDesc.put(IToken.TYPE_COMA,"TOKEN_COMA");
		tokenDesc.put(IToken.TYPE_PUNTO_COMA,"TOKEN_PUNTO_COMA");
		tokenDesc.put(IToken.TYPE_SEPARADOR,"TOKEN_SEPARADOR");
		tokenDesc.put(IToken.TYPE_ERROR,"TOKEN_ERROR");
		tokenDesc.put(IToken.TYPE_FIN_DE_ARCHIVO,"TOKEN_FIN_DE_ARCHIVO");
		
	}

	public boolean isValid(String palabraReservada) {
		return (palabrasReservadas.contains(palabraReservada))?true:false;
	}
	
	public boolean isValid(int tokenType) {
		return (tokenDesc.containsKey(tokenType))?true:false;
	}
	
	public String getTokenDescription(int tokenType) {
		return tokenDesc.get(tokenType);
	}
}
